package ar.com.uade.administradorsiembra.persistencia;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import ar.com.uade.administradorsiembra.common.ContextoTransaccional;
import ar.com.uade.administradorsiembra.modelo.MineralPorcentaje;
import ar.com.uade.administradorsiembra.modelo.exceptions.TransaccionException;

public class MineralPorcentajeMapper extends Mapper<MineralPorcentaje> {

	private MineralMapper mineralMapper;

	@Override
	public boolean guardarTodos(List<MineralPorcentaje> instancias)
			throws TransaccionException {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public boolean guardar(MineralPorcentaje instancia)
			throws TransaccionException {
		int resultado = 0;
		this.logger.info("Guardando el siguiente mineralPorcentaje: " + instancia.getMineral());
		if(instancia.getId() == null){
			ContextoTransaccional contexto = null;
			
			try {
				contexto = super.administradorTransaccional.crearContexto(true);			
				
				String query = "INSERT INTO mineralPorcentaje (idLote,idMineral,porcentaje) VALUES(?,?,?)";		
				List<Object> parametros = new ArrayList<Object>();
				parametros.add(instancia.getIdLote());
				parametros.add(instancia.getMineral().getId());
				parametros.add(instancia.getPorcentaje());
				
				try {
					resultado = this.executeUpdate(query, parametros, contexto.getConexionActual());
					this.logger.info("Se guardo el mineral en forma exitosa.");
				} catch (SQLException e) {
					this.logger.error("Error al guardar el mineral. " + e.getMessage());
				}
			} catch (TransaccionException te) {
				this.logger.error("Error al guardar el mineral. " + te.getMessage());
			} finally {
				contexto.liberarConexion();
			}
			
			return resultado > 0;
		}
		else return this.modificar(instancia);
	}

	@Override
	public boolean modificar(MineralPorcentaje instancia)
			throws TransaccionException {

		this.logger.error("Voy a modificar el instancia: " + instancia);
		
		int resultado = 0;
		ContextoTransaccional contexto = null;
		if(instancia.getPorcentaje() != new Float(0).floatValue()){
		try {
			contexto = super.administradorTransaccional.crearContexto(true);
			
			String query = "UPDATE  mineralPorcentaje SET  idLote = ? , idMineral  = ? , porcentaje = ? WHERE id = ?";
			List<Object> parametros = new ArrayList<Object>();
			
			parametros.add(instancia.getIdLote());
			parametros.add(instancia.getMineral().getId());
			parametros.add(instancia.getPorcentaje());
			parametros.add(instancia.getId());
			
			try {			
				resultado = this.executeUpdate(query, parametros, contexto.getConexionActual());	
				
				
				
			} catch (SQLException e) {
				this.logger.error("Error al modificar el instancia. " + e.getMessage());
			}
		} catch (TransaccionException te) {
			this.logger.error("Error al buscar el instancia. " + te.getMessage());
		} finally {
			contexto.liberarConexion();
		}	
		
		return resultado > 0;
		}else{
			return this.borrar(instancia);
		}
	}

	@Override
	public boolean borrar(MineralPorcentaje instancia)
			throws TransaccionException {
			this.logger.info("Borrando el mineralPorcentaje: " + instancia.getMineral().getId());
		
		int resultado = 0;
		ContextoTransaccional contexto = null;
		
		try {
			contexto = super.administradorTransaccional.crearContexto(true);
			
			String query = "Delete From mineralPorcentaje WHERE id = ?";		
			List<Object> parametros = new ArrayList<Object>();
			
			parametros.add(instancia.getId());
			
			try {		
				resultado = this.executeUpdate(query, parametros, contexto.getConexionActual());				
			} catch (SQLException e) {
				this.logger.error("Error al borrar el mineral. " + e.getMessage());
			}
		} catch (TransaccionException te) {
			this.logger.error("Error al buscar el mineral. " + te.getMessage());
		} finally {
			contexto.liberarConexion();
		}
	
		return resultado > 0;

	}

	@Override
	public List<MineralPorcentaje> buscarTodos() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public MineralPorcentaje buscarPorId(Integer idLote) {
		// TODO Auto-generated method stub
		return null;
	}

	public List<MineralPorcentaje> buscarPorLote(Integer idLote) {
		this.logger.error("Busco el Minerales con porcentaje con idLote " + idLote.toString());

		List<MineralPorcentaje> mineralPorcentaje = new LinkedList<MineralPorcentaje>();
		MineralPorcentaje mineral = null;
		ContextoTransaccional contexto = null;

		try {
			contexto = super.administradorTransaccional.crearContexto(true);

			String queryPropietario = "SELECT id, idLote, idMineral, porcentaje FROM mineralPorcentaje where idLote = ?";
			List<Object> parametrosMinerales = new ArrayList<Object>();

			parametrosMinerales.add(idLote);
			ResultSet rsMineralesPorcentaje;

			try {
				rsMineralesPorcentaje = this.executeQuery(queryPropietario,
						parametrosMinerales, contexto.getConexionActual());

				while (rsMineralesPorcentaje.next()) {
					mineral = new MineralPorcentaje( rsMineralesPorcentaje.getInt("id"),
							rsMineralesPorcentaje.getInt("idLote"),
							this.getMineralMapper().buscarPorId(rsMineralesPorcentaje.getInt("idMineral")),
							rsMineralesPorcentaje.getFloat("porcentaje"));

					mineralPorcentaje.add(mineral);
				}
			} catch (SQLException e) {
				this.logger.error("Error al buscar Propietario. "
						+ e.getMessage());
			}
		} catch (TransaccionException te) {
			this.logger.error("Error al buscar el propietario. " + te.getMessage());
		} finally {
			contexto.liberarConexion();
		}

		return mineralPorcentaje;
	}

	private MineralMapper getMineralMapper() {
		if (this.mineralMapper == null) this.mineralMapper = new MineralMapper();
		return this.mineralMapper;
	}

}
